/***********************************************************************************
 * 文件名： drv_itm.c
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		ITM的RT-Thread驱动，将ITM作为RT-Thread的标准serial设备（串口）。
 * 修改记录：
 * 	2023/4/18: 初版。 刘言。
***********************************************************************************/

#include "rtconfig.h"

#ifdef RT_USING_SERIAL

#include "drv_itm.h"
#include "../mcu.h"
#include "rtdevice.h"
#include "polsys.h"

static polsys_task_t mItmCheckTask;
static struct rt_serial_device mItmSerial;

/**
 * 间隔10ms的软定时器(polsys任务运行在main线程)，用于查询ITM是否收到数据并调用回调函数（模拟中断）
*/
static void ItmTaskLoop()
{
    if(ITM_CheckChar()) // 收到数据
    {
        rt_hw_serial_isr(&mItmSerial, RT_SERIAL_EVENT_RX_IND); //调用RTT的处理函数
    }
}

/**
 * RTT规定要实现的配置函数，ITM不需要进行配置，内容空
*/
static rt_err_t ItmConfigure(struct rt_serial_device *serial, struct serial_configure *cfg)
{
    return RT_EOK;
}

/**
 * RTT规定要实现的控制函数，ITM不需要控制，内容空
*/
static rt_err_t ItmControl(struct rt_serial_device *serial, int cmd, void *arg)
{
    return RT_EOK;
}

/**
 * RTT规定要实现的发一个字节函数
*/
static int ItmPutc(struct rt_serial_device *serial, char c)
{
    RT_ASSERT(serial != RT_NULL);
    ITM_SendChar(c);
    return 1;
}

/**
 * RTT规定要实现的获取一个字节函数，注意这里不能阻塞，若没有数据返回-1
*/
static int ItmGetc(struct rt_serial_device *serial)
{
    int ch;

    RT_ASSERT(serial != RT_NULL);
    ch = -1;
    if (ITM_CheckChar())
        ch = ITM_ReceiveChar();
    return ch;
}

static const struct rt_uart_ops s_itm_ops =
{
    ItmConfigure,
    ItmControl,
    ItmPutc,
    ItmGetc,
};

/**
 * RTT的itm设备初始化
*/
int RtHwItmInit()
{
    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
    int i;

    Polsys_TaskInit(&mItmCheckTask, ItmTaskLoop, 10);

    mItmSerial.ops    = &s_itm_ops;
    mItmSerial.config = config;
    /* register UART device */
    rt_hw_serial_register(&mItmSerial,
                        "itm",
                        RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
                        NULL);
    return 0;
}
// INIT_BOARD_EXPORT(RtHwItmInit); // 加入 board init 队列


#endif


